package com.pai.base.core.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;

import com.alibaba.fastjson.JSON;

public class JsonUtil {      
     
    /**页面传至后台时，json数据在request的参数名称*/     
    public final static String JSON_ATTRIBUTE = "json";      
    public final static String JSON_ATTRIBUTE1 = "json1";      
    public final static String JSON_ATTRIBUTE2 = "json2";      
    public final static String JSON_ATTRIBUTE3 = "json3";      
    public final static String JSON_ATTRIBUTE4 = "json4";
    
    
   /* 
    public final static SerializeConfig S_CONFIG  =  new SerializeConfig();
    public final static ParserConfig P_CONFIG = new ParserConfig();
    static {
    	S_CONFIG.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
    }
    */
          
    /**    
     * 从一个JSON 对象字符格式中得到一个java对象，形如：    
     * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}}    
     * @param object    
     * @param clazz    
     * @return    
     */     
    public static Object getDTO(String jsonString, Class clazz){      
        /*JSONObject jsonObject = null;      
        try{      
            setDataFormat2JAVA();       
            jsonObject = JSONObject.fromObject(jsonString);      
        }catch(Exception e){      
            e.printStackTrace();      
        }      
        return JSONObject.toBean(jsonObject, clazz);*/
    	
    	try {
			return JSON.parseObject(jsonString, clazz);
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    }      
          
    /**    
     * 从一个JSON 对象字符格式中得到一个java对象，其中beansList是一类的集合，形如：    
     * {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...},    
     * beansList:[{}, {}, ...]}    
     * @param jsonString    
     * @param clazz    
     * @param map 集合属性的类型 (key : 集合属性名, value : 集合属性类型class) eg: ("beansList" : Bean.class)    
     * @return    
     */     
    public static Object getDTO(String jsonString, Class clazz, Map map){      
        /*JSONObject jsonObject = null;      
        try{      
            setDataFormat2JAVA();       
            jsonObject = JSONObject.fromObject(jsonString);      
        }catch(Exception e){      
            e.printStackTrace();      
        }      
        return JSONObject.toBean(jsonObject, clazz, map);*/
    	
    	try {
			return JSON.parseObject(jsonString, clazz);
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    }      
          
    /**    
     * 从一个JSON数组得到一个java对象数组，形如：    
     * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]    
     * @param object    
     * @param clazz    
     * @return    
     */     
    public static Object[] getDTOArray(String jsonString, Class clazz){      
        setDataFormat2JAVA();      
        JSONArray array = JSONArray.fromObject(jsonString);      
        Object[] obj = new Object[array.size()];      
        for(int i = 0; i < array.size(); i++){
            JSONObject jsonObject = array.getJSONObject(i);      
            obj[i] = JSONObject.toBean(jsonObject, clazz);      
        }
        return obj;      
    }      
          
    /**    
     * 从一个JSON数组得到一个java对象数组，形如：    
     * [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]    
     * @param object    
     * @param clazz    
     * @param map    
     * @return    
     */     
    public static Object[] getDTOArray(String jsonString, Class clazz, Map map){      
        setDataFormat2JAVA();      
        JSONArray array = JSONArray.fromObject(jsonString);      
        Object[] obj = new Object[array.size()];      
        for(int i = 0; i < array.size(); i++){      
            JSONObject jsonObject = array.getJSONObject(i);      
            obj[i] = JSONObject.toBean(jsonObject, clazz, map);      
        }      
        return obj;      
    }      
          
    /**    
     * 从一个JSON数组得到一个java对象集合    
     * @param object    
     * @param clazz    
     * @return    
     */     
    public static List getDTOList(String jsonString, Class clazz){      
        setDataFormat2JAVA();      
        JSONArray array = JSONArray.fromObject(jsonString);      
        List list = new ArrayList();      
        for(Iterator iter = array.iterator(); iter.hasNext();){      
            JSONObject jsonObject = (JSONObject)iter.next();      
            list.add(JSONObject.toBean(jsonObject, clazz));      
        }      
        return list;      
    }      
          
    /**    
     * 从一个JSON数组得到一个java对象集合，其中对象中包含有集合属性    
     * @param object    
     * @param clazz    
     * @param map 集合属性的类型    
     * @return    
     */     
    public static List getDTOList(String jsonString, Class clazz, Map map){      
        setDataFormat2JAVA();      
        JSONArray array = JSONArray.fromObject(jsonString);      
        List list = new ArrayList();      
        for(Iterator iter = array.iterator(); iter.hasNext();){      
            JSONObject jsonObject = (JSONObject)iter.next();      
            list.add(JSONObject.toBean(jsonObject, clazz, map));      
        }      
        return list;      
    }      
          
    /**    
     * 从json HASH表达式中获取一个map，该map支持嵌套功能    
     * 形如：{"id" : "johncon", "name" : "小强"}    
     * 注意commons-collections版本，必须包含org.apache.commons.collections.map.MultiKeyMap    
     * @param object    
     * @return    
     */     
    public static Map getMapFromJson(String jsonString) {      
        setDataFormat2JAVA();      
        JSONObject jsonObject = JSONObject.fromObject(jsonString);      
        Map map = new HashMap();      
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){      
            String key = (String)iter.next();      
            map.put(key, jsonObject.get(key));      
        }      
        return map;
    }     
    
    /**
     * map<String,list<Class>>
     * @param jsonString
     * @param clazz
     * @return
     */
    public static Map getMapFromJson(String jsonString,Class clazz) {      
        setDataFormat2JAVA();      
        JSONObject jsonObject = JSONObject.fromObject(jsonString);      
        Map map = new HashMap();      
        for(Iterator iter = jsonObject.keys(); iter.hasNext();){      
            String key = (String)iter.next();      
            if (jsonObject.get(key)!=null) {
				 List list=getDTOList( jsonObject.get(key).toString(),clazz);
				  map.put(key,list);     
			}
        }      
        return map;
    }      
    
    
          
    /**    
     * 从json数组中得到相应java数组    
     * json形如：["123", "456"]    
     * @param jsonString    
     * @return    
     */     
    public static Object[] getObjectArrayFromJson(String jsonString) {      
        JSONArray jsonArray = JSONArray.fromObject(jsonString);      
        return jsonArray.toArray();      
    }      
     
     
    /**    
     * 把数据对象转换成json字符串    
     * DTO对象形如：{"id" : idValue, "name" : nameValue, ...}    
     * 数组对象形如：[{}, {}, {}, ...]    
     * map对象形如：{key1 : {"id" : idValue, "name" : nameValue, ...}, key2 : {}, ...}    
     * @param object    
     * @return    
     */     
    public static String getJSONString(Object object) throws Exception{      
       String jsonString = null;      
        //日期值处理器      
        JsonConfig jsonConfig = new JsonConfig();      
        jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor());      
        if(object != null){      
            if(object instanceof Collection || object instanceof Object[]){      
                jsonString = JSONArray.fromObject(object, jsonConfig).toString();      
            }else{      
                jsonString = JSONObject.fromObject(object, jsonConfig).toString();      
            }      
        }      
        return jsonString == null ? "{}" : jsonString;     
    	
        /*
    	try {
			return JSON.toJSONString(object, S_CONFIG);
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    	*/
    }      
          
    private static void setDataFormat2JAVA(){      
        //设定日期转换格式      
        JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}));      
    }      
          
    public static void main(String[] arg) throws Exception{    
    	
        String s = "{status : 'success'}";      
        System.out.println(" object : " + JsonUtil.getJSONString(s));  
        String mode1S="{id:'ada',name:'asdfa',addr:'asdfadfadsfadsf'}";
//        Model1 model1=(Model1)JsonUtil.getDTO(mode1S, Model1.class);
//        System.out.println(model1.toString());
//        
//        String model2S="{id:'ada',name:'asdfa',addr:'asdfadfadsfadsf',model3:{id:'12',name:'name',addr:'addr'}}";
//        Model2 model2=(Model2)JsonUtil.getDTO(model2S, Model2.class);
//        System.out.println(model2.toString());
        
    }      
}